package com.xia.im.websocket;

import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

@Component
@ServerEndpoint("/data-push")  // 指定 WebSocket 路径
public class DataPushServer {
    // 用于存储所有连接的会话
    private static final ConcurrentHashMap<String, Session> sessions = new ConcurrentHashMap<>();

//    // 定时任务调度器
//    private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
//
//    // 静态初始化块，启动数据推送任务
//    static {
//        // 启动定时任务，每秒推送一次数据
//        scheduler.scheduleAtFixedRate(DataPushServer::pushDataToAll, 1, 1, TimeUnit.SECONDS);
//    }

    // 连接建立时调用
    @OnOpen
    public void onOpen(Session session) {
        sessions.put(session.getId(), session);
        System.out.println("新客户端连接: " + session.getId());
    }

    // 连接关闭时调用
    @OnClose
    public void onClose(Session session) {
        sessions.remove(session.getId());
        System.out.println("客户端断开: " + session.getId());
    }

    // 收到消息时调用（本例不需要处理客户端消息）
    @OnMessage
    public void onMessage(String message, Session session) {
        // 这里可以处理客户端发来的消息，但数据推送不需要
        System.out.println("收到消息: " + message);
    }

    // 错误处理
    @OnError
    public void onError(Session session, Throwable error) {
        System.err.println("发生错误: " + session.getId());
        error.printStackTrace();
    }

    // 向所有客户端推送数据
    public void pushDataToAll() {
        if (sessions.isEmpty()) return;
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
            int num = (int) (Math.random() * 40) + 1;
            list.add(num);
        }
        String data = JSON.toJSONString(list);

        // 遍历所有会话并发送数据
        for (Session session : sessions.values()) {
            if (session.isOpen()) {
                try {
                    session.getBasicRemote().sendText(data);
                } catch (IOException e) {
                    System.err.println("发送数据到客户端失败: " + e.getMessage());
                }
            }
        }
    }
}
